/** \file gu_uniform_map.h */
#pragma once

#include "gu_shader_parser.h"
#include "gu_shader_variable.h"

#include "gr_numeric_types.h"

#include<cstdint>
#include<memory>

namespace gu {

typedef uint32_t ShaderLoc;

/** Implements platform specific mapping for uniforms. */
class UniformMap
{
public:
    typedef std::shared_ptr<UniformMap> shared_ptr;

    /** Transfer the data to the uniform with the given location*/
    virtual void mapTo(ShaderLoc loc, float data) = 0;
    virtual void mapTo(ShaderLoc loc, gr::vec3& data) = 0;
    virtual void mapTo(ShaderLoc loc, gr::vec4& data) = 0;
    virtual void mapTo(ShaderLoc loc, gr::mat4& data) = 0;

};

UniformMap* newUniformMap(ShaderDialect dialect);

}
